#region Copyright (c) 2006-2010 Widgetsphere LLC, All Rights Reserved
//--------------------------------------------------------------------- *
//                          Widgetsphere  LLC                           *
//             Copyright (c) 2006-2010 All Rights reserved              *
//                                                                      *
//                                                                      *
//This file and its contents are protected by United States and         *
//International copyright laws.  Unauthorized reproduction and/or       *
//distribution of all or any portion of the code contained herein       *
//is strictly prohibited and will result in severe civil and criminal   *
//penalties.  Any violations of this copyright will be prosecuted       *
//to the fullest extent possible under law.                             *
//                                                                      *
//THE SOURCE CODE CONTAINED HEREIN AND IN RELATED FILES IS PROVIDED     *
//TO THE REGISTERED DEVELOPER FOR THE PURPOSES OF EDUCATION AND         *
//TROUBLESHOOTING. UNDER NO CIRCUMSTANCES MAY ANY PORTION OF THE SOURCE *
//CODE BE DISTRIBUTED, DISCLOSED OR OTHERWISE MADE AVAILABLE TO ANY     *
//THIRD PARTY WITHOUT THE EXPRESS WRITTEN CONSENT OF WIDGETSPHERE LLC   *
//                                                                      *
//UNDER NO CIRCUMSTANCES MAY THE SOURCE CODE BE USED IN WHOLE OR IN     *
//PART, AS THE BASIS FOR CREATING A PRODUCT THAT PROVIDES THE SAME, OR  *
//SUBSTANTIALLY THE SAME, FUNCTIONALITY AS ANY WIDGETSPHERE PRODUCT.    *
//                                                                      *
//THE REGISTERED DEVELOPER ACKNOWLEDGES THAT THIS SOURCE CODE           *
//CONTAINS VALUABLE AND PROPRIETARY TRADE SECRETS OF WIDGETSPHERE,      *
//INC.  THE REGISTERED DEVELOPER AGREES TO EXPEND EVERY EFFORT TO       *
//INSURE ITS CONFIDENTIALITY.                                           *
//                                                                      *
//THE END USER LICENSE AGREEMENT (EULA) ACCOMPANYING THE PRODUCT        *
//PERMITS THE REGISTERED DEVELOPER TO REDISTRIBUTE THE PRODUCT IN       *
//EXECUTABLE FORM ONLY IN SUPPORT OF APPLICATIONS WRITTEN USING         *
//THE PRODUCT.  IT DOES NOT PROVIDE ANY RIGHTS REGARDING THE            *
//SOURCE CODE CONTAINED HEREIN.                                         *
//                                                                      *
//THIS COPYRIGHT NOTICE MAY NOT BE REMOVED FROM THIS FILE.              *
//--------------------------------------------------------------------- *
#endregion
using System;
using System.ComponentModel;
using System.Xml;
using System.Collections;
using Widgetsphere.Generator.Common.GeneratorFramework;
using Widgetsphere.Generator.Common.Util;
using System.Collections.Generic;

namespace Widgetsphere.Generator.Models
{
  [
  Editor(typeof(Widgetsphere.Generator.Design.Editors.CustomViewColumnCollectionEditor), typeof(System.Drawing.Design.UITypeEditor))
  ]
  public class CustomViewColumnCollection : BaseModelCollection, IEnumerable<CustomViewColumn>
  {
    #region Member Variables

    protected Hashtable internalList;
    protected int lastId = 1;

    #endregion

    #region Constructor

    public CustomViewColumnCollection(IModelObject root)
      : base(root)
    {
      internalList = new Hashtable();
    }

    #endregion

    #region Property Implementations

    #endregion

    #region Methods

    public CustomViewColumn[] GetById(int id)
    {
      ArrayList retval = new ArrayList();
      foreach(CustomViewColumn element in this)
      {
        if(element.Id == id)
          retval.Add(element);
      }
      return (CustomViewColumn[])retval.ToArray(typeof(CustomViewColumn));
    }

    #endregion

    #region IXMLable Members

    public override void XmlAppend(XmlNode node)
    {
      XmlDocument oDoc = node.OwnerDocument;

      XmlAttribute keyNode = oDoc.CreateAttribute("key");
      keyNode.Value = this.Key.ToString();
      node.Attributes.Append(keyNode);

      foreach(CustomViewColumn customViewCustomViewColumn in internalList.Values)
      {
        XmlNode customViewCustomViewColumnNode = oDoc.CreateElement("customviewColumn");
        customViewCustomViewColumn.XmlAppend(customViewCustomViewColumnNode);
        node.AppendChild(customViewCustomViewColumnNode);
      }

    }

    public override void XmlLoad(XmlNode node)
    {
      try
      {
        _key = XmlHelper.GetAttributeValue(node, "key", _key);
        XmlNodeList customViewCustomViewColumnNodes = node.SelectNodes("customviewColumn");
        foreach(XmlNode customViewCustomViewColumnNode in customViewCustomViewColumnNodes)
        {
          CustomViewColumn newCustomViewColumn = new CustomViewColumn(this.Root);
          newCustomViewColumn.XmlLoad(customViewCustomViewColumnNode);
          internalList.Add(newCustomViewColumn.Id, newCustomViewColumn);
          if(lastId < newCustomViewColumn.Id)
            lastId = newCustomViewColumn.Id;
        }

        this.Dirty = false;
      }
      catch(Exception ex)
      {
        throw;
      }

    }

    #endregion

    #region IEnumerable Members
    public override IEnumerator GetEnumerator()
    {
			List<CustomViewColumn> al = new List<CustomViewColumn>();
      foreach(int key in internalList.Keys)
				al.Add((CustomViewColumn)internalList[key]);
      return al.GetEnumerator();
    }
    #endregion

    #region IDictionary Members
    public bool IsReadOnly
    {
      get
      {
        return internalList.IsReadOnly;
      }
    }

    public CustomViewColumn this[int customViewCustomViewColumnId]
    {
      get
      {
        return (CustomViewColumn)internalList[customViewCustomViewColumnId];
      }
      set
      {
        internalList[customViewCustomViewColumnId] = value;
      }
    }

    public void Remove(int customViewCustomViewColumnId)
    {
      this.Root.Dirty = true;
      internalList.Remove(customViewCustomViewColumnId);
    }

    public void Remove(CustomViewColumn customViewCustomViewColumn)
    {
      this.Root.Dirty = true;
      internalList.Remove(customViewCustomViewColumn.Id);
    }

    public bool Contains(int customViewCustomViewColumnId)
    {
      return internalList.Contains(customViewCustomViewColumnId);
    }

    public override void Clear()
    {
      internalList.Clear();
    }


    internal void Add(CustomViewColumn value)
    {
      internalList.Add(value.Id, value);
    }

    public CustomViewColumn Add(string name)
    {
      CustomViewColumn newItem = new CustomViewColumn(this.Root);
      newItem.Name = name;
      lastId++;
      newItem.SetId(lastId);
      this.Add(newItem);
      return newItem;
    }

    public override void AddRange(ICollection list)
    {
      foreach(CustomViewColumn element in list)
      {
        lastId++;
        element.SetId(lastId);
        internalList.Add(lastId, element);
      }
    }

    public CustomViewColumn Add()
    {
      return this.Add(this.GetUniqueName());
    }

    public bool IsFixedSize
    {
      get
      {
        return internalList.IsFixedSize;
      }
    }

    public bool Contains(string name)
    {
      foreach(CustomViewColumn customViewCustomViewColumn in this)
      {
        if(string.Compare(customViewCustomViewColumn.Name, name, true) == 0)
        {
          return true;
        }
      }
      return false;
    }

    private string GetUniqueName()
    {
			//const string baseName = "Column";
			//int ii = 1;
			//string newName = baseName + ii.ToString();
			//while(this.Contains(newName))
			//{
			//  ii++;
			//  newName = baseName + ii.ToString();
			//}
			//return newName;
			return "[NEW COLUMN]";
    }

    #endregion

    #region ICollection Members

    public override bool IsSynchronized
    {
      get
      {
        return internalList.IsSynchronized;
      }
    }

    public override int Count
    {
      get
      {
        return internalList.Count;
      }
    }

    public override void CopyTo(Array array, int index)
    {
      internalList.CopyTo(array, index);
    }

    public override object SyncRoot
    {
      get
      {
        return internalList.SyncRoot;
      }
    }

    #endregion

		#region IEnumerable<CustomViewColumn> Members

		IEnumerator<CustomViewColumn> IEnumerable<CustomViewColumn>.GetEnumerator()
		{
			List<CustomViewColumn> al = new List<CustomViewColumn>();
			foreach (int key in internalList.Keys)
				al.Add((CustomViewColumn)internalList[key]);
			return al.GetEnumerator();
		}

		#endregion

  }
}
